package com.oracleoaec.server;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.List;
import java.util.Map;

import com.oracleoaec.entity.Brand;
import com.oracleoaec.entity.Car;
import com.oracleoaec.entity.Category;
import com.oracleoaec.entity.Record;
import com.oracleoaec.entity.User;
import com.oracleoaec.service.AdminService;
import com.oracleoaec.service.AdminServiceImpl;
import com.oracleoaec.service.BrandService;
import com.oracleoaec.service.CarService;
import com.oracleoaec.service.CategoryService;
import com.oracleoaec.service.RecordService;
import com.oracleoaec.service.UserService;
import com.oracleoaec.service.impl.BrandServiceImpl;
import com.oracleoaec.service.impl.CarServiceImpl;
import com.oracleoaec.service.impl.CategoryServiceImpl;
import com.oracleoaec.service.impl.RecordServiceImpl;
import com.oracleoaec.service.impl.UserServiceimpl;
import com.oracleoaec.util.Constant;
import com.oracleoaec.util.JsonMapper;
import com.oracleoaec.util.SHA;
import com.oracleoaec.util.Util;

/*处理客户端请求的新线程执行代码
@author Mary*/
public class ServerDispatchRequestRunnable implements Runnable {
	//与客户端通信的Socket
	private Socket socket = null;
	//读
	private BufferedReader bufr = null;
	//写
	private PrintWriter pw = null;
	//对象与JSON字符串转换的工具类
	private JsonMapper binder  = JsonMapper.nonDefaultMapper();
	
	public ServerDispatchRequestRunnable(Socket socket) {
		this.socket = socket;
		
		try {// 初始化流
			bufr = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			pw = new PrintWriter(socket.getOutputStream(), true);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public void run() {
		try {
			String context = bufr.readLine();//读客户端发送的请求(context是jackson格式)
			String result = dispatch(context);//服务器处理请求之后的返回值
			pw.println(result);//发送给客户端(响应)
		} catch (IOException e) {
			e.printStackTrace();
		}
		close();
	}

	
	/*处理请求
	@param context 请求内容
	@return 处理结果,如果是对象转换为json格式字符串*/
	private UserService userService=new UserServiceimpl();
	
	//显示汽车的方法
	private CarService carService=new CarServiceImpl();
	private BrandService brandService=new BrandServiceImpl();
	private CategoryService categoryService=new CategoryServiceImpl();
	private RecordService recordService=new RecordServiceImpl();
	
	//管理员加车
	private AdminService adminService=new AdminServiceImpl();
	
	public String dispatch(String context) {
		//获取请求头
		//String context="login?username=龚为明&password=123456";
		String header = Util.getHeader(context);
		//结果字符串
		String result = null;
		switch (header) {
		case Constant.GETCODE:
			//System.out.println("header="+header);
			//开始生成二维码进行验证
			//随机生成数字,发送个客户端进行验证
			result=Util.getRecode();
			
			break;
		case Constant.LOGIN:
			Map<String,String> map=Util.getParams(context);
			User user=new User(map.get("username"),map.get("password"),Integer.valueOf(map.get("type")));
			//在这里开始校验
			if(user!=null){
				//进行密码加密
				user.setPassword(SHA.shaSecurity(user.getPassword()));
			}
			
			if((user=userService.userLogin(user))!=null){
				String str=binder.toJson(user);
				//result="1";//登陆成功
				result=str;//登陆成功
			}else{
				result="0";//登陆失败
			}
			break;
		case Constant.FINDUSERBYNAME:
			//先进性切割
			String userName=context.split("\\?")[1];
			//1表示已经存在用户
			//0表示可以注册用户
			String ii=userService.queryByName(userName);
			result=ii;
			break;
		case Constant.REGISTER://用户注册
			//Map<String,String> map2=Util.getParams(context);
			//User user2=new User(map2.get("username"),map2.get("password"));
			String jsonStr=Util.getURI(context);
			User user2=(User)binder.fromJson(jsonStr, User.class);
			if(user2!=null){
				//将密码和身份证号进行加密算法
				user2.setPassword(SHA.shaSecurity(user2.getPassword()));
				user2.setTel(SHA.shaSecurity(user2.getTel()));
				user2.setIdNumber(SHA.shaSecurity(user2.getIdNumber()));
			}
			int i=userService.userRegister(user2);
			if(i>0){
				result="1";//注册成功
			}else if(i==0){
				result="0";//注册失败
			}else{
				result="-1";
			}
			break;
		case Constant.SEARALLCAR://查询所有的汽车信息
			//先显示所有汽车的信息，这些信息都在集合中存着
			String sortWay=Util.getURI(context);
			String[] ar=sortWay.split("=");//按等号进行切割
			String oper=ar[1].split("&")[0];
			List<Car> listCar=carService.searchAllCar(oper,Integer.parseInt(ar[1].split("&")[1]));
			//遍历汽车信息
			if(listCar==null){
				result=0+"";//表示没有汽车信息
			}else{
				//将list集合转化为json格式发送客户端进行显示
				String jsonStr2=binder.toJson(listCar);
				result=jsonStr2;//表示发送客户端的结果是显示所有汽车的信息
			}
			break;
		case Constant.ADDCAR://添加车之前对产品和类型的判断是否存在该类型和品牌
			//System.out.println("contex==="+context);
			//用于判断到底输入的是类型还是品牌的ID号
			long id=Integer.parseInt(context.split("\\?")[1].split("&")[0]);//"addCar?3&"+jsonStr
			//这个f用于判断我们的品牌和类型的操作
			String f=context.split("\\?")[1].split("&")[1];
			if("1".equals(f)){
				Brand brand=brandService.queryBrandNameById(id);
				if(brand!=null){
					result=binder.toJson(brand);//找到了该商品
				}else{
					result="0";//没有找到该商品
				}
			}else if("2".equals(f)){
				Category category=categoryService.queryCategNameById(id);
				if(category!=null){
					result=binder.toJson(category);//找到了该类型产品
				}else{
					result="0";//没有该类型
				}
			}
			break;
		case Constant.FINDCARNUMBER://查找汽车的的车牌号，判断是否有相同的车牌号
			String con=context.split("\\?")[1];
			String name=adminService.isExistCarNumber(con);
			if(name!=null){
				result="1";//车牌号已经存在
			}else{
				result="0";//不存
			}
			break;
		case Constant.REALADDCAR://正真的将汽车添加到数据库中
			//context--->addCar?carJson
			//开始调用插入方法进行插入
			String carJsonStr=context.split("\\?")[1];
			System.out.println("context2323======"+carJsonStr);
			Car car=binder.fromJson(carJsonStr, Car.class);
			//System.out.println("car:"+car.toString());
			if(adminService.addCar(car)){
				result="1";//1表示增加成功
			}else{
				result="0";//0表时不成功
			}
			break;
		case Constant.RENTCAR://租车
			System.out.println(context);//rentCar?1+2(车ID)&2(userId)
			//切割
			Record record=recordService.userRentCar(context);
			//System.out.println("record....="+record);
			String recordStr=binder.toJson(record);
			result=recordStr;
			break;
		case Constant.BACKCAR://归还汽车
			//
			System.out.println("context..backCar="+context);
			Record record2=recordService.userRentCar(context);
			String recordStr2=binder.toJson(record2);
			//System.out.println("record222="+record2.getReturn_date());
			result=recordStr2;
			break;
		case Constant.FINDALLCAR://查找所有的汽车
			System.out.println("context..bac75675kCar="+context);
			String s[]=context.split("\\?");
			List<Record> listR=recordService.queryAllUserRecord(s[1]);
			
			result=binder.toJson(listR);
			break;
			
		case Constant.FINDALLBRAND://用于查询所有的品牌
			System.out.println("findAllBrand!.....");
			List<Brand> bl=brandService.queryAllBrand();
			result=binder.toJson(bl);
			break;
		case Constant.FINDAllCATEGORY://用于显示类型用于给管理员进行选择
			//System.out.println(context);
			System.out.println("findAllCategory...");
			List<Category> cl=categoryService.queryAllCategory();
			result=binder.toJson(cl);
			break;
		case Constant.FINDCARBYID:
			long carId=Long.parseLong(context.split("\\?")[1]);
			Car c=adminService.queryCarById(carId);
			String carJson=binder.toJson(c);
			result=carJson;
			break;
		case Constant.FINDALLRECORD:
			//我要查询所有额车记录
			List<Record> listRe=null;
			String ss=context.split("\\?")[1];//a&100
			String str=ss.split("&")[0];//获取的是1,2,3,用于判断是什么操作
			
			String recJson="0";//表示没有该车租车记录
			if("1".equals(str)){//1:查看所有的汽车记录
				listRe=adminService.queryAllRecord(ss);
				recJson=binder.toJson(listRe);
			}else if("2".equals(str)){//2:按照用户编号查看汽车
				//在按照那个&符号进行切割
				listRe=adminService.queryAllRecord(ss);
				recJson=binder.toJson(listRe);
				
			}else if("3".equals(str)){//3:按照汽车编号查看汽车
				//String str=context.split("\\?")[1].split("&")[1];//获取汽车的ID号
				listRe=adminService.queryAllRecord(ss);
				recJson=binder.toJson(listRe);
			}
			result=recJson;
			break;
		case Constant.ISEXISTCAR:
			//判断是否存在该车
			long carId2=Long.parseLong(context.split("\\?")[1]);
			result=binder.toJson(adminService.queryCarById(carId2));
			break;
			
		//下面都是管理员的更新的代码
		case Constant.UPDATERENT://更新租车价格
			//updateRent?"+car.getId()+"&"+pri//
			String[] arr=context.split("\\?")[1].split("&");
			long cId=Long.parseLong(arr[0]);
			double price=Double.parseDouble(arr[1]);
			Car c1=adminService.updateCarInfo(cId, price);
			result=binder.toJson(c1);
			break;
		case Constant.UPDATEUSEABLE://更新上架和下架
			//updateRent?"+car.getId()+"&"+usealbe//
			String[] arr2=context.split("\\?")[1].split("&");
			long cId2=Long.parseLong(arr2[0]);
			int useable=Integer.parseInt((arr2[1]));
			Car c2=adminService.updateCarUseable(cId2,useable);
			result=binder.toJson(c2);
			break;
		default:
			break;
		}
		return result;
	}
	
	//断开连接，释放资源
	public void close() {
		if (bufr != null) {
			try {
				bufr.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		if (pw != null) {
			pw.close();
		}
		if (socket != null) {
			try {
				socket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
